//
//  MainViewController.swift
//  WeiBo
//
//  Created by Wishing.Star on 2017/1/11.
//  Copyright © 2017年 Wishing.Star. All rights reserved.
//

import UIKit
//主控制器，布局页面下方的导航栏功能
class MainViewController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        setupChildControllers()
        setupComposeButton()
    }
    //MARK: 控件监听方法
    /// 撰写微博按钮 
    //FIXME: 未实现
    func composeStatus() {
        print("监听成功")
    }
    
    //MARK: 控件
    //创建一个图像按钮
    lazy var composeButton: UIButton = UIButton.cz_imageButton("tabbar_compose_icon_add", backgroundImageName: "tabbar_compose_button")


}

//MARK: 设置界面

extension MainViewController {
    //设置撰写微博按钮
    func setupComposeButton() {
        //添加按钮空间到TabBar中
        tabBar.addSubview(composeButton)
        //设置撰写按钮的位置到 空白位置
        //1.计算tabbar中有多少子控制器->对应的按钮数量
        let tabbarCount = childViewControllers.count
        //2.计算当个tabbar按钮宽度
        let buttonWidth = tabBar.bounds.width / CGFloat(tabbarCount) - 1 //tabbar之间有“容错点”的空隙，会导致点击到背景tabbar而不是composeButton的穿帮问题，所以需要减小buttonWidth，增加composeFrame的X宽度
        //3.设置撰写按钮的位置
        composeButton.frame = tabBar.bounds.insetBy(dx: 2 * buttonWidth, dy: 0)
        //测试： 打印按钮宽度，宽度使用“- 1”时为68，未使用时是64
//        print("撰写按钮宽度 \(composeButton.bounds.width)")
        //按钮监听方法
        composeButton.addTarget(self, action: #selector(composeStatus), for: .touchUpInside)  //selector首字母小写
    }
    
    //设置所有子控制器
    func setupChildControllers() {
        //页面字典数组
        let pageArray = [
            //页面字典
            ["pageName": "HomeViewController", "pageTitle": "首页", "pageImageName":"home"],
            ["pageName": "MessageViewController", "pageTitle": "消息", "pageImageName":"message_center"],
            ["PageName": ""],//设置撰写按钮的 空白位置
            ["pageName": "DiscoverViewController", "pageTitle": "发现", "pageImageName":"discover"],
            ["pageName": "ProfileViewController", "pageTitle": "我", "pageImageName":"profile"],
        ]
        //为viewControllers做准备，生成一个可以存放UIViewController的数组
        var pageArrayMultiply = [UIViewController]()
        
        //遍历数组，将pageArray中的所有字典都转换为UIViewController
        for dict in pageArray {
            //通过childController将字典传入后，获取返回的UIViewController，并添加到数组中进行管理
            pageArrayMultiply.append(childControllers(pageDictionary: dict))
        }
        // 设置 tabBar 的子控制器
        viewControllers = pageArrayMultiply
        
        
    }
    
    // 通过字典进行条件反射，创建子控制器后将其返回
    func childControllers(pageDictionary: [String: String]) -> UIViewController {
        //定义字典模型
        /// [pageName: String,pageTitle: String,pageImageName: String]
        guard let pageName = pageDictionary["pageName"],
            let pageTitle = pageDictionary["pageTitle"],
            let pageImageNmae = pageDictionary["pageImageName"],
            //通过条件反射获取pageName的视图控制器
            //pageName由于是在同一句控制流中定义，无法自动补全，需要手动输入。可以在guard let外面写完后，再拷贝到此处进行可选项转换
            let pageVC = NSClassFromString("\(Bundle.main.nameSpace()).\(pageName)") as? UIViewController.Type else {
                //如果字典中有nil值，则默认返回UIViewController()
            return UIViewController()
            }
        //创建视图控制器
        let vc = pageVC.init()
        
        vc.title = pageTitle
        
        vc.tabBarItem.image = UIImage(named: "tabbar_" + pageImageNmae)
        vc.tabBarItem.selectedImage = UIImage(named: "tabbar_" + pageImageNmae + "_selected")?.withRenderingMode(.alwaysOriginal) //渲染被选中的图片，显示正确的图片颜色
        
        //设置TabBar字体颜色
        //vc.tabBarItem.setTitleTextAttributes(<#T##attributes: [String : Any]?##[String : Any]?#>, for: <#T##UIControlState#>) //属性字典<#T##attributes: [String : Any]?##[String : Any]?#> 在 UIKit.NSAttributedString 中查看字典内容
        vc.tabBarItem.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.orange], for: .highlighted)
        //设置TabBar Normal字体 大小,默认为12号
        vc.tabBarItem.setTitleTextAttributes([NSFontAttributeName: UIFont.systemFont(ofSize: 12)], for: UIControlState(rawValue: 0)) //不使用UIControlState时，使用UIControlState(rawValue: 0)默认
        
        //实例化导航控制器的时候，会调用 push 方法将 rootVC 压栈，TabBar最多可以存放5个，超过的将使用“More”收纳存放
        let nvc = NavigationController(rootViewController: vc)
        //多态  nvc:NavigationController:UINavigationController:UIViewController
        return nvc
    
    }
}
